package algorithm.stringAlgorithm;

/**
 * @ClassName: ConvertZ
 * @Description 6. Z 字形变换
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 *
 * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
 *
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
 *
 * 请你实现这个将字符串进行指定行数变换的函数：
 *
 * string convert(string s, int numRows);
 *
 * @Author skywingking
 * @Date 2022/3/1 10:15 下午
 **/
public class ConvertZ {
    public String convert(String s, int numRows) {
        if(null == s || s.length() == 0){
            return s;
        }
        if(numRows == 1 || numRows >= s.length()){
            return s;
        }
        long t = numRows * 2 - 2;
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i < numRows;i++){
            for(int j = 0; j < s.length() -i;j+=t){
                sb.append(s.charAt(j+i));
                if(0 < i && i < numRows - 1 & j + t - i < s.length()){
                    sb.append(s.charAt((int)(j + t - i)));
                }
            }
        }
        return sb.append("").toString();
    }
}